home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume27 / dmake / part22 < prev    next >
Encoding:
Text File  |  1992-01-29  |  40.0 KB  |  1,348 lines

  1. Newsgroups: comp.sources.misc
  2. From: dvadura@plg.waterloo.edu (Dennis Vadura)
  3. Subject:  v27i123:  dmake - dmake Version 3.8, Part22/41
  4. Message-ID: <1992Jan28.214333.19336@sparky.imd.sterling.com>
  5. X-Md4-Signature: 0a2c3090e0f8f2dc24f4c6de875e7a74
  6. Date: Tue, 28 Jan 1992 21:43:33 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: dvadura@plg.waterloo.edu (Dennis Vadura)
  10. Posting-number: Volume 27, Issue 123
  11. Archive-name: dmake/part22
  12. Environment: Atari-ST, Coherent, Mac, MSDOS, OS/2, UNIX
  13. Supersedes: dmake: Volume 19, Issue 22-58
  14.  
  15. ---- Cut Here and feed the following to sh ----
  16. # this is dmake.shar.22 (part 22 of a multipart archive)
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file dmake/msdos/bccdos/public.h continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 22; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test -f _shar_wnt_.tmp; then
  33. sed 's/^X//' << 'SHAR_EOF' >> 'dmake/msdos/bccdos/public.h' &&
  34. -- 
  35. --      This program is free software; you can redistribute it and/or
  36. --      modify it under the terms of the GNU General Public License
  37. --      (version 1), as published by the Free Software Foundation, and
  38. --      found in the file 'LICENSE' included with this distribution.
  39. -- 
  40. --      This program is distributed in the hope that it will be useful,
  41. --      but WITHOUT ANY WARRANTY; without even the implied warrant of
  42. --      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  43. --      GNU General Public License for more details.
  44. -- 
  45. --      You should have received a copy of the GNU General Public License
  46. --      along with this program;  if not, write to the Free Software
  47. --      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  48. --
  49. -- LOG
  50. --     $Log$
  51. */
  52. X
  53. #ifndef _DMAKE_PUBLIC_h
  54. #define _DMAKE_PUBLIC_h
  55. X
  56. void Infer_recipe ANSI((CELLPTR, CELLPTR));
  57. int Make_targets ANSI(());
  58. int Exec_commands ANSI((CELLPTR));
  59. void Print_cmnd ANSI((char *, int, int));
  60. void Pop_dir ANSI((int));
  61. void Append_line ANSI((char *, int, FILE *, char *, int, int));
  62. void Stat_target ANSI((CELLPTR, int));
  63. char * Expand ANSI((char *));
  64. char * Apply_edit ANSI((char *, char *, char *, int, int));
  65. void Map_esc ANSI((char *));
  66. char* Apply_modifiers ANSI((int, char *));
  67. char* Tokenize ANSI((char *, char *));
  68. char * _strjoin ANSI((char *, char *, int, int));
  69. char * _stradd ANSI((char *, char *, int));
  70. char * _strapp ANSI((char *, char *));
  71. char * _strdup ANSI((char *));
  72. char * _strdup2 ANSI((char *));
  73. char * _strpbrk ANSI((char *, char *));
  74. char * _strspn ANSI((char *, char *));
  75. char * _strstr ANSI((char *, char *));
  76. char * _substr ANSI((char *, char *));
  77. uint16 Hash ANSI((char *, uint32 *));
  78. HASHPTR Get_name ANSI((char *, HASHPTR *, int));
  79. HASHPTR Search_table ANSI((HASHPTR *, char *, uint16 *, uint32 *));
  80. HASHPTR Def_macro ANSI((char *, char *, int));
  81. CELLPTR Def_cell ANSI((char *));
  82. LINKPTR Add_prerequisite ANSI((CELLPTR, CELLPTR, int, int));
  83. void Clear_prerequisites ANSI((CELLPTR));
  84. int Test_circle ANSI((CELLPTR, int));
  85. STRINGPTR Def_recipe ANSI((char *, STRINGPTR, int, int));
  86. t_attr Rcp_attribute ANSI((char *));
  87. int main ANSI((int, char **));
  88. FILE * Openfile ANSI((char *, int, int));
  89. FILE * Closefile ANSI(());
  90. FILE * Search_file ANSI((char *, char **));
  91. char * Filename ANSI(());
  92. int Nestlevel ANSI(());
  93. void No_ram ANSI(());
  94. int Usage ANSI((int));
  95. int Version ANSI(());
  96. char * Get_suffix ANSI((char *));
  97. char * Build_path ANSI((char *, char *));
  98. void Make_rules ANSI(());
  99. void Create_macro_vars ANSI(());
  100. time_t Do_stat ANSI((char *, char *, char **));
  101. int Do_touch ANSI((char *, char *, char **));
  102. void Void_lib_cache ANSI((char *, char *));
  103. time_t Do_time ANSI(());
  104. int Do_cmnd ANSI((char *, int, int, CELLPTR, int, int, int));
  105. char ** Pack_argv ANSI((int, int, char *));
  106. char * Read_env_string ANSI((char *));
  107. int Write_env_string ANSI((char *, char *));
  108. void ReadEnvironment ANSI(());
  109. void Catch_signals ANSI((void (*)()));
  110. void Clear_signals ANSI(());
  111. void Prolog ANSI((int, char* []));
  112. void Epilog ANSI((int));
  113. char * Get_current_dir ANSI(());
  114. int Set_dir ANSI((char*));
  115. char Get_switch_char ANSI(());
  116. FILE* Get_temp ANSI((char **, char *, int));
  117. FILE * Start_temp ANSI((char *, CELLPTR, char **));
  118. void Open_temp_error ANSI((char *, char *));
  119. void Link_temp ANSI((CELLPTR, FILE *, char *));
  120. void Close_temp ANSI((CELLPTR, FILE *));
  121. void Unlink_temp_files ANSI((CELLPTR));
  122. void Handle_result ANSI((int, int, int, CELLPTR));
  123. void Update_time_stamp ANSI((CELLPTR));
  124. int Remove_file ANSI((char *));
  125. void Parse ANSI((FILE *));
  126. int Get_line ANSI((char *, FILE *));
  127. char * Do_comment ANSI((char *, char **, int));
  128. char * Get_token ANSI((TKSTRPTR, char *, int));
  129. void Quit ANSI(());
  130. void Read_state ANSI(());
  131. void Write_state ANSI(());
  132. int Check_state ANSI((CELLPTR, STRINGPTR *, int));
  133. char* basename ANSI((char *));
  134. void Dump ANSI(());
  135. void Dump_recipe ANSI((STRINGPTR));
  136. int Parse_macro ANSI((char *, int));
  137. int Macro_op ANSI((char *));
  138. int Parse_rule_def ANSI((int *));
  139. int Rule_op ANSI((char *));
  140. void Add_recipe_to_list ANSI((char *, int, int));
  141. void Bind_rules_to_targets ANSI((int));
  142. int Set_group_attributes ANSI((char *));
  143. DFALINKPTR Match_dfa ANSI((char *));
  144. void Check_circle_dfa ANSI(());
  145. void Add_nfa ANSI((char *));
  146. char * Exec_function ANSI((char *));
  147. int If_root_path ANSI((char *));
  148. int runargv ANSI((CELLPTR, int, int, int, int, char *));
  149. void Clean_up_processes ANSI(());
  150. int Wait_for_child ANSI((int, int));
  151. time_t seek_arch ANSI((char*, char*));
  152. int touch_arch ANSI((char*, char*));
  153. int _chdir ANSI((char *));
  154. void Remove_prq ANSI((CELLPTR));
  155. void Hook_std_writes ANSI((char *));
  156. X
  157. #endif
  158. SHAR_EOF
  159. chmod 0640 dmake/msdos/bccdos/public.h ||
  160. echo 'restore of dmake/msdos/bccdos/public.h failed'
  161. Wc_c="`wc -c < 'dmake/msdos/bccdos/public.h'`"
  162. test 5547 -eq "$Wc_c" ||
  163.     echo 'dmake/msdos/bccdos/public.h: original size 5547, current size' "$Wc_c"
  164. rm -f _shar_wnt_.tmp
  165. fi
  166. # ============= dmake/msdos/bccdos/startup.mk ==============
  167. if test -f 'dmake/msdos/bccdos/startup.mk' -a X"$1" != X"-c"; then
  168.     echo 'x - skipping dmake/msdos/bccdos/startup.mk (File already exists)'
  169.     rm -f _shar_wnt_.tmp
  170. else
  171. > _shar_wnt_.tmp
  172. sed 's/^X//' << 'SHAR_EOF' > 'dmake/msdos/bccdos/startup.mk' &&
  173. # MSDOS DMAKE startup file.  Customize to suit your needs.
  174. # Assumes MKS toolkit for the tool commands, and Turbo-C.  Change as req'd.
  175. # See the documentation for a description of internally defined macros.
  176. #
  177. # Disable warnings for macros redefined here that were given
  178. # on the command line.
  179. __.SILENT := $(.SILENT)
  180. .SILENT   := yes
  181. X
  182. # Configuration parameters for DMAKE startup.mk file
  183. # Set these to NON-NULL if you wish to turn the parameter on.
  184. _HAVE_RCS    := yes        # yes => RCS  is installed.
  185. _HAVE_SCCS    :=         # yes => SCCS is installed.
  186. X
  187. # Applicable suffix definitions
  188. A := .lib    # Libraries
  189. E := .exe    # Executables
  190. F := .for    # Fortran
  191. O := .obj    # Objects
  192. P := .pas    # Pascal
  193. S := .asm    # Assembler sources
  194. V :=         # RCS suffix
  195. X
  196. # See if these are defined
  197. TMPDIR := $(ROOTDIR)/tmp
  198. .IMPORT .IGNORE : TMPDIR SHELL COMSPEC
  199. X
  200. # Recipe execution configurations
  201. # First set SHELL, If it is not defined, use COMSPEC, otherwise
  202. # it is assumed to be MKS Korn SHELL.
  203. .IF $(SHELL) == $(NULL)
  204. .IF $(COMSPEC) == $(NULL)
  205. X   SHELL := $(ROOTDIR)/bin/sh$E
  206. .ELSE
  207. X   SHELL := $(COMSPEC)
  208. .END
  209. .END
  210. GROUPSHELL := $(SHELL)
  211. X
  212. # Now set remaining arguments depending on which SHELL we
  213. # are going to use.  COMSPEC (assumed to be command.com) or
  214. # MKS Korn Shell.
  215. .IF $(SHELL)==$(COMSPEC)
  216. X   SHELLFLAGS  := $(SWITCHAR)c
  217. X   GROUPFLAGS  := $(SHELLFLAGS)
  218. X   SHELLMETAS  := *"?<>
  219. X   GROUPSUFFIX := .bat
  220. X   DIRSEPSTR   := \\
  221. X   DIVFILE      = $(TMPFILE:s,/,\)
  222. .ELSE
  223. X   SHELLFLAGS  := -c
  224. X   GROUPFLAGS  := 
  225. X   SHELLMETAS  := *"?<>|()&][$$\#`'
  226. X   GROUPSUFFIX := .ksh
  227. X   .MKSARGS    := yes
  228. X   DIVFILE      = $(TMPFILE:s,/,${DIVSEP_shell_${USESHELL}})
  229. X   DIVSEP_shell_yes := \\\
  230. X   DIVSEP_shell_no  := \\
  231. .END
  232. X
  233. # Standard C-language command names and flags
  234. X   CC      := bcc        # C-compiler and flags
  235. X   CFLAGS  +=
  236. X
  237. X   AS      := tasm        # Assembler and flags
  238. X   ASFLAGS += 
  239. X
  240. X   LD       = tlink        # Loader and flags
  241. X   LDFLAGS +=
  242. X   LDLIBS   =
  243. X
  244. # Definition of $(MAKE) macro for recursive makes.
  245. X   MAKE = $(MAKECMD) $(MFLAGS)
  246. X
  247. # Language and Parser generation Tools and their flags
  248. X   YACC      := yacc        # standard yacc
  249. X   YFLAGS +=
  250. X   YTAB      := ytab        # yacc output files name stem.
  251. X
  252. X   LEX      := lex        # standard lex
  253. X   LFLAGS +=
  254. X   LEXYY  := lex_yy        # lex output file
  255. X
  256. # Other Compilers, Tools and their flags
  257. X   PC    := tpc            # pascal compiler
  258. X   RC    := anyf77        # ratfor compiler
  259. X   FC    := anyf77        # fortran compiler
  260. X
  261. X   CO       := co        # check out for RCS
  262. X   COFLAGS += -q
  263. X
  264. X   AR     := ar            # archiver
  265. X   ARFLAGS+= ruv
  266. X
  267. X   RM       := rm        # remove a file command
  268. X   RMFLAGS +=
  269. X
  270. # Implicit generation rules for making inferences.
  271. # We don't provide .yr or .ye rules here.  They're obsolete.
  272. # Rules for making *$O
  273. X   %$O .SWAP: %.c ; $(CC) $(CFLAGS) -c $<
  274. X   %$O .SWAP: %$P ; $(PC) $(PFLAGS) -c $<
  275. X   %$O .SWAP: %$S ; $(AS) $(ASFLAGS) $(<:s,/,\);
  276. X   %$O : %.cl ; class -c $<
  277. X   %$O .SWAP: %.e %.r %.F %$F ; $(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<
  278. X
  279. # Executables
  280. X   %$E .SWAP: %$O ; $(CC) $(LDFLAGS) -e$@ $<
  281. X
  282. # lex and yacc rules
  283. X   %.c .SWAP: %.y ; $(YACC)  $(YFLAGS) $<; mv $(YTAB).c $@
  284. X   %.c .SWAP: %.l ; $(LEX)   $(LFLAGS) $<; mv $(LEXYY).c $@
  285. X
  286. # RCS support
  287. .IF $(_HAVE_RCS)
  288. X   % : $$(@:d)RCS/$$(@:f)$V;- $(CO) $(COFLAGS) $@
  289. X   .NOINFER : $$(@:d)RCS/$$(@:f)$V
  290. .END
  291. X
  292. # SCCS support
  293. .IF $(_HAVE_SCCS)
  294. X   % : s.% ; get $<
  295. X   .NOINFER : s.%
  296. .END
  297. X
  298. # Recipe to make archive files.
  299. %$A .SWAP:
  300. [
  301. X   $(AR) $(ARFLAGS) $@ $?
  302. X   $(RM) $(RMFLAGS) $?
  303. ]
  304. X
  305. # DMAKE uses this recipe to remove intermediate targets
  306. .REMOVE :; $(RM) -f $<
  307. X
  308. # AUGMAKE extensions for SYSV compatibility
  309. @B = $(@:b)
  310. @D = $(@:d)
  311. @F = $(@:f)
  312. "*B" = $(*:b)
  313. "*D" = $(*:d)
  314. "*F" = $(*:f)
  315. <B = $(<:b)
  316. <D = $(<:d)
  317. <F = $(<:f)
  318. ?B = $(?:b)
  319. ?F = $(?:f)
  320. ?D = $(?:d)
  321. X
  322. # Turn warnings back to previous setting.
  323. .SILENT := $(__.SILENT)
  324. X
  325. # Local init file if any, gets parsed before user makefile
  326. .INCLUDE .IGNORE: "_startup.mk"
  327. SHAR_EOF
  328. chmod 0640 dmake/msdos/bccdos/startup.mk ||
  329. echo 'restore of dmake/msdos/bccdos/startup.mk failed'
  330. Wc_c="`wc -c < 'dmake/msdos/bccdos/startup.mk'`"
  331. test 3831 -eq "$Wc_c" ||
  332.     echo 'dmake/msdos/bccdos/startup.mk: original size 3831, current size' "$Wc_c"
  333. rm -f _shar_wnt_.tmp
  334. fi
  335. # ============= dmake/msdos/bccdos/tempnam.c ==============
  336. if test -f 'dmake/msdos/bccdos/tempnam.c' -a X"$1" != X"-c"; then
  337.     echo 'x - skipping dmake/msdos/bccdos/tempnam.c (File already exists)'
  338.     rm -f _shar_wnt_.tmp
  339. else
  340. > _shar_wnt_.tmp
  341. sed 's/^X//' << 'SHAR_EOF' > 'dmake/msdos/bccdos/tempnam.c' &&
  342. /*LINTLIBRARY*/
  343. #include <stdio.h>
  344. #include <string.h>
  345. #include <stdlib.h>
  346. #include <dos.h>
  347. X
  348. #if defined(max)
  349. #   undef  max
  350. #endif
  351. #define max(A,B) (((A)<(B))?(B):(A))
  352. X
  353. extern char *mktemp();
  354. extern int access();
  355. int _access();
  356. X
  357. /* Turbo C stdio.h doesn't define P_tmpdir, so let's do it here */
  358. /* Under DOS leave the default tmpdir pointing here!        */
  359. static char *P_tmpdir = "";
  360. X
  361. char *
  362. tempnam(dir, prefix)
  363. char *dir;        /* use this directory please (if non-NULL) */
  364. char *prefix;        /* use this (if non-NULL) as filename prefix */
  365. {
  366. X   static         int count = 0;
  367. X   register char *p, *q, *tmpdir;
  368. X   int            tl=0, dl=0, pl;
  369. X   char          buf[30];
  370. X
  371. X   pl = strlen(P_tmpdir);
  372. X
  373. X   if( (tmpdir = getenv("TMPDIR")) != NULL ) tl = strlen(tmpdir);
  374. X   if( dir != NULL ) dl = strlen(dir);
  375. X
  376. X   if( (p = malloc((unsigned)(max(max(dl,tl),pl)+13))) == NULL )
  377. X     return(NULL);
  378. X
  379. X   *p = '\0';
  380. X
  381. X   if( (tl == 0) || (_access( strcpy(p, tmpdir), 0) != 0) )
  382. X     if( (dl == 0) || (_access( strcpy(p, dir), 0) != 0) )
  383. X    if( _access( strcpy(p, P_tmpdir), 0) != 0 )
  384. X       if( !prefix )
  385. X          prefix = "tp";
  386. X
  387. X   if(prefix)
  388. X   {
  389. X      *(p+strlen(p)+2) = '\0';
  390. X      (void)strncat(p, prefix, 2);
  391. X   }
  392. X
  393. X   sprintf( buf, "%08x", _psp );
  394. X   buf[6]='\0';
  395. X   (void)strcat(p, buf );
  396. X   sprintf( buf, "%04d", count++ );
  397. X   q=p+strlen(p)-6;
  398. X   *q++ = buf[0]; *q++ = buf[1];
  399. X   *q++ = buf[2]; *q++ = buf[3];
  400. X
  401. X   if( (q = strrchr(p,'.')) != NULL ) *q = '\0';
  402. X
  403. X   return(p);
  404. }
  405. X
  406. X
  407. X
  408. _access( name, flag )
  409. char *name;
  410. int  flag;
  411. {
  412. X   char *p;
  413. X   int r;
  414. X
  415. X   if( name == NULL || !*name ) return(1);  /* NULL dir means current dir */
  416. X   r = access( name, flag );
  417. X   p = name+strlen(name)-1;
  418. X   if(*p != '/' && *p != '\\') strcat( p, "/" );
  419. X
  420. X   return( r );
  421. }
  422. SHAR_EOF
  423. chmod 0640 dmake/msdos/bccdos/tempnam.c ||
  424. echo 'restore of dmake/msdos/bccdos/tempnam.c failed'
  425. Wc_c="`wc -c < 'dmake/msdos/bccdos/tempnam.c'`"
  426. test 1724 -eq "$Wc_c" ||
  427.     echo 'dmake/msdos/bccdos/tempnam.c: original size 1724, current size' "$Wc_c"
  428. rm -f _shar_wnt_.tmp
  429. fi
  430. # ============= dmake/msdos/bccdos/utime.c ==============
  431. if test -f 'dmake/msdos/bccdos/utime.c' -a X"$1" != X"-c"; then
  432.     echo 'x - skipping dmake/msdos/bccdos/utime.c (File already exists)'
  433.     rm -f _shar_wnt_.tmp
  434. else
  435. > _shar_wnt_.tmp
  436. sed 's/^X//' << 'SHAR_EOF' > 'dmake/msdos/bccdos/utime.c' &&
  437. /*
  438. ** change access and modify times of file
  439. */
  440. #include <sys/stat.h>
  441. #include <fcntl.h>
  442. #include <time.h>
  443. X
  444. int
  445. utime(name, timep)/*
  446. ====================
  447. X    Broken for turbo C it only sets the file time to the current time by
  448. X    touching a character in the file */
  449. char*    name;
  450. time_t    timep[2];
  451. {
  452. X    struct  stat buf;
  453. X    int    fil;
  454. X    char    data;
  455. X
  456. X    if (stat(name, &buf) != 0)
  457. X        return (-1);
  458. X    if (buf.st_size != 0)  {
  459. X        if ((fil = open(name, O_RDWR, S_IWRITE)) < 0)
  460. X            return (-1);
  461. X        if (read(fil, &data, 1) < 1) {
  462. X            close(fil);
  463. X            return (-1);
  464. X        }
  465. X        lseek(fil, 0L, 0);
  466. X        if (write(fil, &data, 1) < 1) {
  467. X            close(fil);
  468. X            return (-1);
  469. X        }
  470. X        close(fil);
  471. X        return (0);
  472. X    } else     if ((fil = creat(name, S_IWRITE)) < 0) {
  473. X        return (-1);
  474. X    } else {
  475. X        close(fil);
  476. X        return (0);
  477. X    }
  478. }
  479. SHAR_EOF
  480. chmod 0640 dmake/msdos/bccdos/utime.c ||
  481. echo 'restore of dmake/msdos/bccdos/utime.c failed'
  482. Wc_c="`wc -c < 'dmake/msdos/bccdos/utime.c'`"
  483. test 767 -eq "$Wc_c" ||
  484.     echo 'dmake/msdos/bccdos/utime.c: original size 767, current size' "$Wc_c"
  485. rm -f _shar_wnt_.tmp
  486. fi
  487. # ============= dmake/msdos/config.mk ==============
  488. if test -f 'dmake/msdos/config.mk' -a X"$1" != X"-c"; then
  489.     echo 'x - skipping dmake/msdos/config.mk (File already exists)'
  490.     rm -f _shar_wnt_.tmp
  491. else
  492. > _shar_wnt_.tmp
  493. sed 's/^X//' << 'SHAR_EOF' > 'dmake/msdos/config.mk' &&
  494. # This is an OS specific configuration file
  495. #    It assumes that OBJDIR, TARGET and DEBUG are previously defined.
  496. #    It defines    CFLAGS, LDARGS, CPPFLAGS, STARTUPFILE, LDOBJS
  497. #    It augments    SRC, OBJDIR, TARGET, CFLAGS, LDLIBS
  498. #
  499. X
  500. # Memory model to compile for
  501. # set to s - small, m - medium, c - compact, l - large
  502. # Need large model now, dmake has grown up :-)
  503. MODEL = l
  504. X
  505. STARTUPFILE    = $(OS)/startup.mk
  506. X
  507. CPPFLAGS     = $(CFLAGS)
  508. LDOBJS        = $(CSTARTUP) $(OBJDIR)/{$(<:f)}
  509. LDARGS        = $(LDHEAD) @$(LDTMPOBJ),$(TARGET),NUL.MAP$(LDTAIL)
  510. LDTAIL        = $(_libs)$(LDFLAGS:s/ //)
  511. _libs           = $(!null,$(LDLIBS) ,@$(LDTMPLIB))
  512. LDTMPOBJ    = $(mktmp,,$(DIVFILE) $(LDOBJS:s,/,\\,:t"+\n")\n)
  513. LDTMPLIB    = $(mktmp,,$(DIVFILE) $(LDLIBS:s,/,\\,:t"+\n")\n)
  514. X
  515. # Debug flags
  516. DB_CFLAGS    = -DDBUG
  517. DB_LDFLAGS    =
  518. DB_LDLIBS    =
  519. X
  520. # NO Debug flags
  521. NDB_CFLAGS    =
  522. NDB_LDFLAGS    =
  523. NDB_LDLIBS    =
  524. X
  525. # Local configuration modifications for CFLAGS.
  526. CFLAGS         += -I$(OS)
  527. X
  528. # Common MSDOS source files.
  529. # Define SWAP to anything but 'y' for the swap code to be excluded on making.
  530. # Swapping for DOS versions is enabled by default.
  531. # Note: swapping is handled specially for ZTC in msdos/ztcdos/config.mk.
  532. SWAP *= y
  533. .IF $(OSRELEASE) != ztcdos
  534. X   .IF $(SWAP) == y
  535. X      SWP_SRC = find.c spawn.c
  536. X      ASRC += exec.asm
  537. X   .ELSE
  538. X      SWP_SRC = tee.c
  539. X   .END
  540. .ELSE
  541. X   SWP_SRC = tee.c
  542. .END
  543. X
  544. OS_SRC += ruletab.c dirbrk.c runargv.c arlib.c _chdir.c switchar.c rmprq.c\
  545. X        $(SWP_SRC)
  546. SRC += $(OS_SRC)
  547. .SETDIR=$(OS) : $(ASRC) $(OS_SRC)
  548. X
  549. # Provide our own %$O : %$S rule.
  550. %$O : %$S
  551. X    $(AS) $(ASFLAGS) $(<:s,/,\,);
  552. X    mv $(@:f) $(OBJDIR)
  553. X
  554. # Set source dirs so that we can find files named in this
  555. # config file.
  556. .SOURCE.h : $(OS)
  557. X
  558. # See if we modify anything in the lower levels.
  559. .IF $(OSRELEASE) != $(NULL)
  560. X   .INCLUDE .IGNORE : $(OS)$(DIRSEPSTR)$(OSRELEASE)$(DIRSEPSTR)config.mk
  561. .END
  562. SHAR_EOF
  563. chmod 0640 dmake/msdos/config.mk ||
  564. echo 'restore of dmake/msdos/config.mk failed'
  565. Wc_c="`wc -c < 'dmake/msdos/config.mk'`"
  566. test 1821 -eq "$Wc_c" ||
  567.     echo 'dmake/msdos/config.mk: original size 1821, current size' "$Wc_c"
  568. rm -f _shar_wnt_.tmp
  569. fi
  570. # ============= dmake/msdos/dirbrk.c ==============
  571. if test -f 'dmake/msdos/dirbrk.c' -a X"$1" != X"-c"; then
  572.     echo 'x - skipping dmake/msdos/dirbrk.c (File already exists)'
  573.     rm -f _shar_wnt_.tmp
  574. else
  575. > _shar_wnt_.tmp
  576. sed 's/^X//' << 'SHAR_EOF' > 'dmake/msdos/dirbrk.c' &&
  577. /* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/msdos/dirbrk.c,v 1.1 1992/01/24 03:27:29 dvadura Exp $
  578. -- SYNOPSIS -- define the directory separator string.
  579. -- 
  580. -- DESCRIPTION
  581. --     Define this string for any character that may appear in a path name
  582. --    and can be used as a directory separator.
  583. --
  584. -- AUTHOR
  585. --      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  586. --      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  587. --
  588. -- COPYRIGHT
  589. --      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  590. -- 
  591. --      This program is free software; you can redistribute it and/or
  592. --      modify it under the terms of the GNU General Public License
  593. --      (version 1), as published by the Free Software Foundation, and
  594. --      found in the file 'LICENSE' included with this distribution.
  595. -- 
  596. --      This program is distributed in the hope that it will be useful,
  597. --      but WITHOUT ANY WARRANTY; without even the implied warrant of
  598. --      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  599. --      GNU General Public License for more details.
  600. -- 
  601. --      You should have received a copy of the GNU General Public License
  602. --      along with this program;  if not, write to the Free Software
  603. --      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  604. --
  605. -- LOG
  606. --     $Log: dirbrk.c,v $
  607. X * Revision 1.1  1992/01/24  03:27:29  dvadura
  608. X * dmake Version 3.8, Initial revision
  609. X *
  610. */
  611. X
  612. #include "extern.h"
  613. X
  614. /* dos uses /, \, and : */
  615. char*    DirBrkStr = "/\\:";
  616. X
  617. /*
  618. ** Return TRUE if the name is the full specification of a path name to a file
  619. ** starting at the root of the file system, otherwise return FALSE
  620. */
  621. PUBLIC int
  622. If_root_path(name)
  623. char *name;
  624. {
  625. X   return( (strchr(DirBrkStr, *name) != NIL(char)) ||
  626. X           (isalpha(*name) && name[1] == ':') );
  627. }
  628. SHAR_EOF
  629. chmod 0640 dmake/msdos/dirbrk.c ||
  630. echo 'restore of dmake/msdos/dirbrk.c failed'
  631. Wc_c="`wc -c < 'dmake/msdos/dirbrk.c'`"
  632. test 1785 -eq "$Wc_c" ||
  633.     echo 'dmake/msdos/dirbrk.c: original size 1785, current size' "$Wc_c"
  634. rm -f _shar_wnt_.tmp
  635. fi
  636. # ============= dmake/msdos/dirlib.h ==============
  637. if test -f 'dmake/msdos/dirlib.h' -a X"$1" != X"-c"; then
  638.     echo 'x - skipping dmake/msdos/dirlib.h (File already exists)'
  639.     rm -f _shar_wnt_.tmp
  640. else
  641. > _shar_wnt_.tmp
  642. sed 's/^X//' << 'SHAR_EOF' > 'dmake/msdos/dirlib.h' &&
  643. /* DIRLIB.H by M. J. Weinstein   Released to public domain 1-Jan-89 */
  644. X
  645. #ifndef _DIRLIB_h_
  646. #define _DIRLIB_h_
  647. X
  648. #include <stdio.h>
  649. #include "stdmacs.h"
  650. X
  651. #define MAXNAMLEN   15
  652. X
  653. struct direct {
  654. X   long              d_ino;
  655. X   unsigned short    d_reclen;
  656. X   unsigned short    d_namlen;
  657. X   char              d_name[MAXNAMLEN+1];
  658. };
  659. X
  660. typedef struct {
  661. X   char   fcb[21];
  662. X   char   attr;
  663. X   short  time;
  664. X   short  date;
  665. X   long   size;
  666. X   char   name[13];
  667. } DTA;
  668. X
  669. typedef struct {
  670. X   DTA    dd_dta;       /* disk transfer area for this dir.        */
  671. X   short  dd_stat;      /* status return from last lookup          */
  672. X   char   dd_name[1];   /* full name of file -- struct is extended */
  673. } DIR;
  674. X
  675. extern DIR           *opendir   ANSI((char *));
  676. extern struct direct *readdir   ANSI((DIR *));
  677. extern long          telldir    ANSI((DIR *));
  678. extern void          seekdir    ANSI((DIR *, long));
  679. extern void          closedir   ANSI((DIR *));
  680. extern DTA           *findfirst ANSI((char *, DTA *));
  681. extern DTA           *findnext  ANSI((DTA *));
  682. X
  683. #define rewinddir(dirp)   seekdir(dirp,0L)
  684. #endif
  685. SHAR_EOF
  686. chmod 0640 dmake/msdos/dirlib.h ||
  687. echo 'restore of dmake/msdos/dirlib.h failed'
  688. Wc_c="`wc -c < 'dmake/msdos/dirlib.h'`"
  689. test 1086 -eq "$Wc_c" ||
  690.     echo 'dmake/msdos/dirlib.h: original size 1086, current size' "$Wc_c"
  691. rm -f _shar_wnt_.tmp
  692. fi
  693. # ============= dmake/msdos/exec.asm ==============
  694. if test -f 'dmake/msdos/exec.asm' -a X"$1" != X"-c"; then
  695.     echo 'x - skipping dmake/msdos/exec.asm (File already exists)'
  696.     rm -f _shar_wnt_.tmp
  697. else
  698. > _shar_wnt_.tmp
  699. sed 's/^X//' << 'SHAR_EOF' > 'dmake/msdos/exec.asm' &&
  700. ; DESCRIPTION
  701. ;      This code is a model independent version of DOS exec that will swap
  702. ;      the calling process out to secondary storage prior to running the
  703. ;      child.  The prototype for calling the exec function is below.
  704. ;
  705. ;      exec( int swap, char far *program, char far *cmdtail,
  706. ;         int environment_seg, char far *tmpfilename );
  707. ;
  708. ;
  709. ;      To assemble this file issue the command:
  710. ;
  711. ;         tasm /mx /t /dmmodel exec.asm
  712. ;
  713. ;      where 'model' is one of {small, compact, medium, large}, you may
  714. ;      also use MASM 5.1 to assemble this file, in this case simply replace
  715. ;      'tasm' with 'masm' in the above command line.
  716. ;
  717. ; AUTHOR
  718. ;      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  719. ;      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  720. ;
  721. ; COPYRIGHT
  722. ;      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  723. ;      This program is free software; you can redistribute it and/or
  724. ;      modify it under the terms of the GNU General Public License
  725. ;      (version 1), as published by the Free Software Foundation, and
  726. ;      found in the file 'LICENSE' included with this distribution.
  727. ;      This program is distributed in the hope that it will be useful,
  728. ;      but WITHOUT ANY WARRANTY; without even the implied warrant of
  729. ;      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  730. ;      GNU General Public License for more details.
  731. ;      You should have received a copy of the GNU General Public License
  732. ;      along with this program;  if not, write to the Free Software
  733. ;      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  734. ;
  735. ifdef have286
  736. X .286    ; define have286 with -D for 80286 processor or better
  737. X    mpusha Macro
  738. X        pusha
  739. X    Endm
  740. X
  741. X    mpopa Macro
  742. X        popa
  743. X    Endm
  744. X
  745. else    ; 8088/8086 compatible
  746. X    mpusha Macro
  747. X        push ax
  748. X    push cx
  749. X    push dx
  750. X    push bx
  751. X    push sp
  752. X    push bp
  753. X    push si
  754. X    push di
  755. X    Endm
  756. X
  757. X    mpopa Macro
  758. X        pop di
  759. X    pop si
  760. X    pop bp
  761. X    add sp,2
  762. X    pop bx
  763. X    pop dx
  764. X    pop cx
  765. X    pop ax
  766. X    Endm
  767. endif
  768. X
  769. ifdef msmall
  770. X            .model    small
  771. argbase        equ    4
  772. endif
  773. ifdef mcompact
  774. X        .model  compact
  775. argbase        equ    4
  776. endif
  777. ifdef mmedium
  778. X        .model    medium
  779. argbase        equ    6
  780. endif
  781. ifdef mlarge
  782. X        .model    large
  783. argbase        equ    6
  784. endif
  785. a_swap        equ    <bp+argbase+0>
  786. a_prog        equ    <bp+argbase+2>
  787. a_tail        equ    <bp+argbase+6>
  788. a_env         equ    <bp+argbase+10>
  789. a_tmp        equ    <bp+argbase+12>
  790. X
  791. a_handle    equ    <bp+argbase>
  792. X
  793. X
  794. ; Define all useful equ's
  795. swap_xms    equ    0        ; we swapped it out to xms
  796. swap_ems    equ    2        ; we swapped it out to ems
  797. swap_file    equ    4        ; we swapped it out to a file
  798. seg_no_alloc    equ    0        ; this is part of a segment
  799. seg_alloc    equ    1        ; this is a full segment header
  800. seg_data    equ    2        ; this is data for part of a segment
  801. X
  802. X
  803. ; Define any global/external variables that we will be accessing from here.
  804. X            .data
  805. X        extrn    _errno:word        ; Set to dos ret code from exec
  806. X        public  _Interrupted        ; Set to 1 if interrupted 0
  807. _Interrupted    dw    0            ; otherwise
  808. X
  809. X            .code
  810. X        assume    cs:@code, ds:@code, ss:@code, es:@code
  811. X
  812. X        even
  813. execstack    dw    64  dup (?)    ; put the temporary exec stack right
  814. exec_sp        label    word        ; at the start.
  815. X
  816. old_ss        dw    ?        ; save stack seg across exec
  817. old_sp        dw    ?        ; save stack ptr across exec
  818. progsize    dw    ?        ; original size of the program
  819. rootsize    dw    ?        ; size of base root kept during swap
  820. resend        dw    ?        ; paragraph where resident code ends
  821. envseg        dw    ?        ; paragraph of environment segment
  822. psp        dw    ?        ; our own psp
  823. swap        dw    ?        ; swapping selection flag
  824. eretcode    dw    ?        ; return code from exec
  825. interrupted    dw    ?        ; interrupted flag for exec
  826. arenahead    dw    ?        ; start of memory block list
  827. alstr        dw    ?        ; allocation strategy save spot
  828. in_exec        dw    0        ; flag, 1 ==> in exec
  829. X
  830. cmdpath        db    65  dup(?)    ; file to exec
  831. cmdtail        db    129 dup(?)    ; its command tail
  832. fcb        db    37  dup(0)    ; dummy fcb
  833. tmpseg        db    7   dup(?)    ; block header buffer
  834. X
  835. tmpname        db    65  dup(0)    ; name of temporary file resource
  836. X
  837. X        even
  838. tmphandle    dw    ?        ; handle for temporary file
  839. real_21h    dd    0        ; will be DOS's 21h vector if doing -C
  840. X
  841. std_fil_handle    dw    ?        ; file handle for -C file
  842. std_fil_number    db    ?        ; system file number for -C file
  843. our_stdout    db    ?        ; sys file number our stdout handle
  844. X
  845. error_rhdr    db    "exec: Failure reading header block", 0DH, 0AH, '$'
  846. error_rseg    db    "exec: Failure reading segment data", 0DH, 0AH, '$'
  847. error_resize    db    "exec: Failure on resize", 0DH, 0AH, '$'
  848. error_free    db    "exec: Failure to free a block", 0DH, 0AH, '$'
  849. error_string    db    "exec: Program swap failure", 0DH, 0AH, '$'
  850. error_alloc    db    "exec: Memory blocks don't match", 0DH, 0AH, '$'
  851. X
  852. X        even
  853. write_header label word
  854. X   whdr_xms_ptr        dw    word ptr whdr_xms
  855. X   whdr_ems_ptr        dw    word ptr whdr_ems
  856. X   whdr_file_ptr    dw    word ptr whdr_file
  857. X
  858. write_seg label word
  859. X   wseg_xms_ptr        dw    word ptr wseg_xms
  860. X   wseg_ems_ptr        dw    word ptr wseg_ems
  861. X   wseg_file_ptr    dw    word ptr wseg_file
  862. X
  863. read_header label word
  864. X   rhdr_xms_ptr        dw    word ptr rhdr_xms
  865. X   rhdr_ems_ptr        dw    word ptr rhdr_ems
  866. X   rhdr_file_ptr    dw    word ptr rhdr_file
  867. X
  868. read_seg label word
  869. X   rseg_xms_ptr        dw    word ptr rseg_xms
  870. X   rseg_ems_ptr        dw    word ptr rseg_ems
  871. X   rseg_file_ptr    dw    word ptr rseg_file
  872. X
  873. free_resource label word
  874. X   free_xms_ptr        dw    word ptr free_xms_resource
  875. X   free_ems_ptr        dw    word ptr free_ems_resource
  876. X   free_file_ptr    dw    word ptr free_file_resource
  877. X
  878. reset_resource label word
  879. X   reset_xms_ptr    dw    word ptr reset_xms_resource
  880. X   reset_ems_ptr    dw    word ptr reset_ems_resource
  881. X   reset_file_ptr    dw    word ptr reset_file_resource
  882. X
  883. old_ctl_brk label dword
  884. X   old_ctl_brk_off    dw    ?
  885. X   old_ctl_brk_seg     dw    ?
  886. X
  887. old_crit_err label dword
  888. X   old_crit_err_off    dw    ?
  889. X   old_crit_err_seg     dw    ?
  890. X
  891. exec_block label word
  892. X  ex_envseg    dw    ?            ; env seg, use parent's if 0
  893. X  ex_cmdtail    dd    ?            ; command tail for exec
  894. X  ex_fcb1    dd    far ptr fcb        ; fcb's aren't used by dmake
  895. X  ex_fcb2    dd    far ptr fcb
  896. X  ex_ss        dw    ?            ; saved ss for exec
  897. X  ex_sp        dw    ?            ; saved sp for exec
  898. X  ex_error    dw    0            ; error code for dos exec
  899. X
  900. X
  901. ; Special 21h (DOS call) handler to tee stdout/stderr writes to the -C file.
  902. ; Ignore 21h calls that aren't writes to 1 or 2; i.e., pass them to DOS handler.
  903. ; If write call was from this process, it's pretty simple to duplicate it
  904. ; to the -C file.  If it's from another process, we try to write to its
  905. ; inherited handle.  Worst case is where the handle wasn't inherited: someone
  906. ; closed it.  In that instance we have to switch to dmake's PSP to do the
  907. ; duplicate write.
  908. X
  909. ; Subprocesses do not get their stdout/stderr teed to the -C file if
  910. ; their stdout/stderr no longer points to the file/device that dmake's
  911. ; stdout points to.  This is tested by looking at the process's job
  912. ; file table, which is a table that maps process handles to DOS system file
  913. ; table numbers.  (The far pointer to the JFT is at the PSP offset 34h.)
  914. ; The JFT is also queried to see if the -C file was inherited.
  915. X
  916. ; O_BINARY, O_TEXT problems are ignored here.  These are fudged by the
  917. ; C library before it calls DOS; since we're working below that level
  918. ; we don't have to worry about it.
  919. X
  920. simulate_21h Macro
  921. X    pushf            ;; direct call to DOS
  922. X    call cs:[real_21h]
  923. X    Endm
  924. X
  925. X    assume cs:@code, ds:nothing, es:nothing, ss:nothing
  926. our_21h_handler proc far
  927. X    pushf
  928. X    cmp ah,40h        ; is this a write?
  929. X    jne call_dos    ; --no
  930. X    cmp bx,1        ; write on handle 1 (stdout?)
  931. X    je duplicate_it
  932. X    cmp bx,2        ; stderr?
  933. X    je duplicate_it
  934. X
  935. call_dos:
  936. X    popf
  937. X    jmp [real_21h]    ; far jump to real handler, which will do the sys call
  938. X                ; and return to the original caller
  939. X
  940. duplicate_it:
  941. X    mpusha
  942. X    push ds
  943. X    push es
  944. X    mov bp,sp
  945. X
  946. X    mov di,std_fil_handle    ; handle of the -C file
  947. X
  948. X  If @codesize eq 0
  949. X      ; Small/compact models allow for quick test of us versus subprocess.
  950. X    ; False negative (it's us with a different CS) will be picked
  951. X    ; up by code just below.  (Might happen due to call from C library.)
  952. X    ; False positives would be bad, but can't happen.
  953. X    mov ax,[bp+24]    ; caller's CS
  954. X    cmp ax,@code    ; same as us?
  955. X    je call_from_dmake
  956. X  Endif
  957. X
  958. X    mov ah,51h        ; get PSP ("undocumented version" works in DOS 2.0+)
  959. X    simulate_21h    ; PSP segment returned in BX
  960. X    cmp bx,psp        ; our PSP?
  961. X    je call_from_dmake    ; --yes, no PSP changing needed
  962. X
  963. X    mov es,bx        ; set ES to current (caller's) PSP
  964. X    lds bx,es:[34h]    ; set DS:BX pointing to caller's job file table
  965. X
  966. X    mov si,[bp+12]    ; file handle caller passed in (known to be 1 or 2)
  967. X    mov al,[bx+si]    ; system file number corresponding to caller's handle
  968. X    cmp al,our_stdout    ; same as our stdout?
  969. X    jne do_real_write    ; no--subprocess must have redirected it
  970. X
  971. X    mov al,[bx+di]    ; see if caller has dup of -C file still open
  972. X    cmp al,std_fil_number
  973. X    je use_dup        ; yes--we can write using caller's PSP
  974. X
  975. X        ; Calling process (or some intermediate process) has closed
  976. X    ; the -C descriptor.  We'll use dmake's (our) -C descriptor, but
  977. X    ; to do so we'll have to change the PSP.  Disable BREAK handling
  978. X    ; so that ^break doesn't kill the wrong process.
  979. X
  980. X    mov ax,3300h    ; get BREAK flag
  981. X    simulate_21h
  982. X    mov si,dx        ; save BREAK state in SI
  983. X    sub dx,dx        ; now turn break flag off
  984. X    mov ax,3301h
  985. X    simulate_21h    ; don't want ^Break recoginized while PSP changed
  986. X    mov bx,psp        ; set dmake's PSP
  987. X    mov ah,50h
  988. X    simulate_21h
  989. X
  990. X    mov bx,di            ; handle of -C file
  991. X    ; CX still has caller's count
  992. X    mov ds,[bp+2]        ; restore caller's DS
  993. X    mov dx,[bp+14]        ; DS:DX again points to caller's buffer
  994. X    mov ah,40h
  995. X    simulate_21h        ; write the copy
  996. X
  997. X    mov bx,es        ; caller's PSP
  998. X    mov ah,50h        ; set PSP
  999. X    simulate_21h    ; restore caller's PSP
  1000. X    mov dx,si        ; break state before we changed it
  1001. X    mov ax,3301h
  1002. X    simulate_21h    ; restore break state
  1003. X
  1004. X    jmp short do_real_write
  1005. X
  1006. use_dup:
  1007. X    mov ds,[bp+2]        ; restore caller's DS
  1008. X    mov dx,[bp+14]        ; DS:DX again points to caller's buffer
  1009. X
  1010. call_from_dmake:
  1011. X    mov bx,di            ; handle of -C file
  1012. X    mov ah,40h            ; write
  1013. X    ; CX still has caller's count
  1014. X    simulate_21h        ; write to the file
  1015. X
  1016. do_real_write:
  1017. X    pop es
  1018. X    pop ds
  1019. X    mpopa
  1020. X    popf
  1021. X    jmp [real_21h]    ; far jump to real handler, which will do the sys call
  1022. X                ; and return to the original caller
  1023. our_21h_handler endp
  1024. X
  1025. X    assume    cs:@code, ds:@code, ss:@code, es:@code
  1026. X
  1027. ;-----------------------------------------------------------------------------
  1028. ; First define the critical-error and control-brk handlers. 
  1029. ; The critical error handler simply pops the machine state and returns an
  1030. ; access denied result code.
  1031. crit_err_handler proc far
  1032. X        add    sp, 6        ; ip/cs/flags ...
  1033. X        pop    ax
  1034. X        pop    bx
  1035. X        pop    cx
  1036. X        pop    dx
  1037. X        pop    si
  1038. X        pop    di
  1039. X        pop    bp
  1040. X        pop    ds
  1041. X        pop    es
  1042. X        push    bp        ; fix up the return flags
  1043. X        mov    bp, sp
  1044. X        xchg    ax, [bp+6]    ; get the flag byte.
  1045. X        or    ax, 1        ; set the carry bit
  1046. X        xchg    ax, [bp+6]    ; put it back.
  1047. X        pop    bp
  1048. X        mov    ax, 5        ; access denied
  1049. X        iret
  1050. crit_err_handler endp
  1051. X
  1052. X
  1053. ;-----------------------------------------------------------------------------
  1054. ; Here we set the interrupted flag, and terminate the currently running
  1055. ; process.
  1056. ctl_brk_handler proc far
  1057. X        clc                ; make sure carry is clear
  1058. X        inc    cs:interrupted        ; set the flag
  1059. X
  1060. ; Make certain it isn't us that is going to get terminated.
  1061. ; There is a small window where the in_exec flag is set but the child is
  1062. ; not running yet, I assume that DOS doesn't test for ctl_brk at that time
  1063. ; as it is bussily creating a new process.
  1064. X        cmp    cs:in_exec,0
  1065. X        je    just_return        ; note this implies CF == 0
  1066. X        stc                ; set CF to abort child
  1067. just_return:    iret
  1068. ctl_brk_handler endp
  1069. X
  1070. X
  1071. ;-----------------------------------------------------------------------------
  1072. ; Something really nasty happened, so abort the exec call and exit.
  1073. ; This kills the calling process altogether, and is a very nasty way of
  1074. ; termination since files may still be open etc.
  1075. abort_exec_rhdr label near
  1076. X        mov    dx, offset error_rhdr
  1077. X        jmp    print_it
  1078. abort_exec_rseg label near
  1079. X        mov    dx, offset error_rseg
  1080. X        jmp    print_it
  1081. abort_exec_resize label near
  1082. X        mov    dx, offset error_resize
  1083. X        jmp    print_it
  1084. abort_exec_free label near
  1085. X        mov    dx, offset error_free
  1086. X        jmp    print_it
  1087. abort_exec_alloc label near
  1088. X        mov    dx, offset error_alloc
  1089. X        jmp    print_it
  1090. abort_exec proc near
  1091. X        mov    dx, offset error_string
  1092. print_it:    push    dx
  1093. X        mov    bx, [swap]
  1094. X        call    [free_resource+bx]
  1095. X        mov    ax, cs
  1096. X        mov    ds, ax
  1097. X        pop    dx
  1098. X        mov    ah, 9
  1099. X        int    21H
  1100. kill_program:    mov    ax, 04cffH            ; nuke it!
  1101. X        int    21H
  1102. abort_exec endp
  1103. X
  1104. X
  1105. ;-----------------------------------------------------------------------------
  1106. ; lodsw/stosw loop to copy data.  Called only for word copy operations.
  1107. ;     ds:si  - point at source
  1108. ;    es:di  - point at destination
  1109. ;    cx     - count of bytes to copy.
  1110. copy_data proc near
  1111. X        shr    cx, 1        ; convert to word count
  1112. X        jnc    copy_words
  1113. X        movsb
  1114. copy_words:    rep    movsw        ; copy the words.
  1115. X        ret
  1116. copy_data endp
  1117. X
  1118. X
  1119. X
  1120. ;=============================================================================
  1121. ; THE FOLLOWING SECTION DEALS WITH ALL ROUTINES REQUIRED TO READ XMS RECORDS.
  1122. ;=============================================================================
  1123. rhdr_xms proc near
  1124. X        ret
  1125. rhdr_xms endp
  1126. X
  1127. rseg_xms proc near
  1128. X        ret
  1129. rseg_xms endp
  1130. X
  1131. reset_xms_resource proc near
  1132. X        ret
  1133. reset_xms_resource endp
  1134. X
  1135. free_xms_resource proc near
  1136. X        ret
  1137. free_xms_resource endp
  1138. ;=============================================================================
  1139. X
  1140. X
  1141. X
  1142. ;=============================================================================
  1143. ; THE FOLLOWING SECTION DEALS WITH ALL ROUTINES REQUIRED TO READ EMS RECORDS.
  1144. ;=============================================================================
  1145. rhdr_ems proc near
  1146. X        ret
  1147. rhdr_ems endp
  1148. X
  1149. rseg_ems proc near
  1150. X        ret
  1151. rseg_ems endp
  1152. X
  1153. reset_ems_resource proc near
  1154. X        ret
  1155. reset_ems_resource endp
  1156. X
  1157. free_ems_resource proc near
  1158. X        ret
  1159. free_ems_resource endp
  1160. ;=============================================================================
  1161. X
  1162. X
  1163. X
  1164. ;=============================================================================
  1165. ; THE FOLLOWING SECTION DEALS WITH ALL ROUTINES REQUIRED TO READ FILE RECORDS.
  1166. ;=============================================================================
  1167. ; This routine reads a segment header from a file.
  1168. ; The header is a seven byte record formatted as follows:
  1169. ;    segment address        - of data
  1170. ;    offset address        - of data
  1171. ;     length in paragraphs    - of data
  1172. ;    mode            - 1 => segment header (allocate seg on read)
  1173. ;                  0 => subsegment, don't allocate on read.
  1174. ; The information is placed into the tmpseg data area in the code segment.
  1175. ; The routine aborts if an error is detected.
  1176. rhdr_file proc near
  1177. X        mov    dx, offset tmpseg    ; read the header record out
  1178. X        mov    cx, 7
  1179. X        mov    bx, [tmphandle]
  1180. X        mov    ah, 03fH
  1181. X        int    21H
  1182. X        jnc    rhdr_done        ; make sure it worked
  1183. X        jmp    abort_exec_rhdr
  1184. X
  1185. rhdr_done:    cmp    ax, 7
  1186. X        je    exit_rhdr_file
  1187. X        or    ax, ax
  1188. X        je    signal_eof
  1189. X        jmp    abort_exec_rhdr
  1190. X
  1191. signal_eof:    stc
  1192. exit_rhdr_file:    ret
  1193. rhdr_file endp
  1194. X
  1195. X
  1196. ;-----------------------------------------------------------------------------
  1197. ; Read a segment from the temporary file whose handle is in cs:tmphandle.
  1198. ; The routine aborts if an error is detected.
  1199. rseg_file proc near
  1200. X        push    ds
  1201. X        mov    ds, word ptr cs:tmpseg; Now read the whole segment
  1202. X        mov    dx, word ptr cs:tmpseg+2
  1203. X        mov    cx, word ptr cs:tmpseg+4
  1204. X        mov    bx, cs:tmphandle
  1205. X        mov    ah, 03fH
  1206. X        int    21H
  1207. X        pop    ds
  1208. X        jnc    rseg_done
  1209. X        jmp    abort_exec_rseg
  1210. X
  1211. rseg_done:    cmp    ax, [word ptr tmpseg+4]
  1212. X        je    exit_rseg_file
  1213. X        jmp    abort_exec_rseg        ; If we didn't get read full
  1214. exit_rseg_file:    ret                ; segment then abort
  1215. rseg_file endp
  1216. X
  1217. X
  1218. ;-----------------------------------------------------------------------------
  1219. ; Seek to the beginning of the file.
  1220. reset_file_resource proc near
  1221. X        mov    bx, [tmphandle]
  1222. X        xor    cx, cx
  1223. X        mov    dx, cx
  1224. X        mov    ax, 04200H        ; seek to begining of file
  1225. X        int    21H
  1226. X        ret
  1227. reset_file_resource endp
  1228. X
  1229. X
  1230. ;-----------------------------------------------------------------------------
  1231. ; unlink the temporary file allocated for swapping.
  1232. ; We close the file first, and then delete it.   We ignore errors here since
  1233. ; we can't do anything about them anyway.
  1234. free_file_resource proc near
  1235. X        mov    bx, [tmphandle]        ; get the file handle
  1236. X        mov    ah, 03eH        ; close the file
  1237. X        int    21H
  1238. X        mov    dx, offset tmpname    ; Now delete the temp file
  1239. X        mov    ah, 041H
  1240. X        int    21H
  1241. X        ret
  1242. free_file_resource endp
  1243. ;=============================================================================
  1244. X
  1245. X
  1246. X
  1247. ;=============================================================================
  1248. ; CODE TO SWAP THE IMAGE IN FROM SECONDARY STORAGE
  1249. ;=============================================================================
  1250. swap_in proc near
  1251. X        mov    bx, [alstr]        ; get previous alloc strategy
  1252. X        mov    ax, 5801H        ; and set it back
  1253. X        int    21H
  1254. X        mov    bx, [swap]        ; get type of resource
  1255. X        call    [reset_resource+bx]    ; reset the resource
  1256. X        mov    es, [psp]        ; resize the program back
  1257. X        mov    bx, [progsize]        ; to original size
  1258. X        mov    ah, 04AH
  1259. X        int    21H
  1260. X        jnc    read_seg_loop
  1261. X        jmp    abort_exec
  1262. X
  1263. read_seg_loop:    mov    bx, [swap]        ; get type of resource
  1264. X        call    [read_header+bx]    ; get seg header
  1265. X        jc    exit_swap_in        ; all done
  1266. X        mov    al, [tmpseg+6]
  1267. X        cmp    al, seg_no_alloc    ; see if dummy segment header
  1268. X        je    read_seg_loop
  1269. X        cmp    al, seg_alloc        ; do we need to do an alloc?
  1270. X        jne    read_data        ; nope
  1271. X
  1272. ; Allocate back the memory for a segment that is not the [psp], note that this
  1273. ; must come back to the same segment we had previously since other segments
  1274. ; may have pointers stored in their variables that point to this segment using
  1275. ; segment:offset long pointers.
  1276. X        mov    bx, [word ptr tmpseg+4]    ; get count of paragraphs
  1277. X        mov    ah, 048H        ; dos_alloc
  1278. X        int    21H
  1279. X        jc    alloc_error        ; oops!
  1280. X        cmp    ax, [word ptr tmpseg]    ; did we get the same segment?
  1281. X        je    read_seg_loop        ; yup!
  1282. alloc_error:    jmp    abort_exec_alloc
  1283. X
  1284. read_data:    mov    bx, [swap]
  1285. X        call    [read_seg+bx]        ; this must succeed, if fail
  1286. X        jmp    read_seg_loop        ; we never come back here
  1287. X
  1288. exit_swap_in:    mov    bx, [swap]        ; all done, so free resource
  1289. X        call    [free_resource+bx]
  1290. X        ret
  1291. swap_in endp
  1292. X
  1293. X
  1294. ;=============================================================================
  1295. ; CODE TO SWAP THE IMAGE OUT TO SECONDARY STORAGE
  1296. ;=============================================================================
  1297. ; This routine is called to swap the non-resident portion of the program
  1298. ; out to the resource specified by the value of [cs:swap].  If the swap out
  1299. ; fails, then appropriate routines are called to free the resources allocated
  1300. ; up to that point.
  1301. ;
  1302. ; The steps used to swap the program out are as follows:
  1303. ;    - calculate new size of program to remain resident and size to swap
  1304. ;      out.
  1305. ;    - write out non-resident portion of current segment
  1306. ;    - walk DOS allocation chain and write out all other segments owned by
  1307. ;      the current program that are contiguous with the _psp segment
  1308. ;    - copy the environment down to low memory
  1309. ;    - resize the current _psp segment to savesize
  1310. ;    - free all segments belonging to program except current _psp segment
  1311. swap_out proc near
  1312. X        mov    ax, 05800H    ; get memory alocation strategy
  1313. X        int    021H
  1314. X        mov    [alstr], ax    ; and save it for future restoration.
  1315. X        mov    di, [psp]    ; compute length of program to current
  1316. X        mov    bx, cs        ; value of cs, and find program size
  1317. X        sub    bx, di        ; by looking at length stored in
  1318. X        mov    ax, di        ; arena header found in front of psp
  1319. X        dec    ax
  1320. X        mov    es, ax
  1321. X        mov    si, es:3    ; si is size of program in paragraphs
  1322. X        mov    [progsize], si    ; progsize now contains the size.
  1323. X
  1324. ; Now compute length of program segment to save.
  1325. ; Length is:   cs - psp + (offset overlay_code_here+15 >> 4)
  1326. X        mov    ax, offset overlay_code_here+15
  1327. X        shr    ax, 1
  1328. X        shr    ax, 1
  1329. X        shr    ax, 1
  1330. X        shr    ax, 1
  1331. X        add    bx, ax            ; bx is size of program to keep
  1332. X        sub    si, bx            ; si is # of paragraphs to save.
  1333. X        add    di, bx            ; di is paragraph to start at
  1334. X        mov    rootsize, bx
  1335. X        mov    resend, di        ; cs:resend is saved start para
  1336. X        mov    al, seg_no_alloc    ; set no allocation for segment
  1337. SHAR_EOF
  1338. true || echo 'restore of dmake/msdos/exec.asm failed'
  1339. fi
  1340. echo 'End of part 22, continue with part 23'
  1341. echo 23 > _shar_seq_.tmp
  1342. exit 0
  1343. exit 0 # Just in case...
  1344.